package com.cs.beneficios.business.entity;

import com.cs.beneficios.business.model.ProgramaVO;
import com.cs.beneficios.business.model.RepAtributoVO;
import com.cs.beneficios.business.model.RepBeneficioOtorgadoVO;
import com.cs.beneficios.business.model.SubProgramaVO;
import com.cs.beneficios.business.model.VflexVO;
import com.cs.beneficios.common.ConnectionFactory;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

public class RepBeneficioOtorgadoDAO
{
  /**
   * Conexion a la base de datos.
   */
  private Connection conn = null;
  private ConnectionFactory cf;

  /**
   * Constructor que inicializa la conexion con la base de datos.
   * @param conn Conexion con la base de datos.
   */
  public RepBeneficioOtorgadoDAO(ConnectionFactory cf)
  {
    this.cf = cf;
    try{
      this.conn = this.cf.getConnection();
    }catch(SQLException e){}
  }
  
  public Collection getBeneficioOtorgado(RepBeneficioOtorgadoVO criterea) throws SQLException
  {
    String query = "SELECT COUNT(beneotor.codigo) cantidad_otorgada, sede.CODIGO codsede, "+
                   "sede.NOMBRE nomsede, prog.CODIGO codpro, prog.NOMBRE nompro, "+
                   "subpro.CODIGO codsubpro, subpro.NOMBRE nomsubpro "+
                   "FROM TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA subpro, "+
                   "TCS_BEN_BENEFICIO_OTORGADO beneotor, TCS_BEN_SEDE sede "+
                   "WHERE beneotor.SBPR_CODIGO =  subpro.CODIGO "+
                   "AND beneotor.SEDE_CODIGO = sede.CODIGO AND subpro.PRG_CODIGO = prog.CODIGO "+
                   "AND beneotor.FECHA_BENEFICIO <= sysdate and prog.vigencia='A' and subpro.vigencia='A' ";
    
    
    if((Object)criterea.getCodeSede() != null)
    {
      query += " and sede.CODIGO = "+criterea.getCodeSede();
    }
    if((Object)criterea.getCodeSubprograma() != null)
    {
      query += " and subpro.CODIGO = "+criterea.getCodeSubprograma();
    }
    if((Object)criterea.getCodePrograma() != null)
    {
      query += " and prog.CODIGO = "+criterea.getCodePrograma();
    }
   
    if((Object)criterea.getDesde() != null && (Object)criterea.getHasta() != null)
    {
      query += " and beneotor.FECHA_BENEFICIO between to_date('"+criterea.getDesde()+"','dd/mm/yyyy') and to_date('"+criterea.getHasta()+"','dd/mm/yyyy')";
    }
    
    if((Object)criterea.getGestor() != null && criterea.getCodigoAtrGestor() != null){
      query += " and Fcs_Ben_Valor_Atributo("+criterea.getCodigoAtrGestor()+", beneotor.CODIGO, beneotor.BEN_CODIGO, beneotor.FECHA_BENEFICIO) = '"+criterea.getGestor()+"' ";
    }
//    if((Object)criterea.getDesde() != null && (Object)criterea.getHasta() == null)
//    {
//      query += "and beneotor.FECHA_BENEFICIO >= '"+criterea.getDesde()+"'";
//    }
//    if((Object)criterea.getDesde() == null && (Object)criterea.getHasta() != null)
//    {
//      query += "and beneotor.FECHA_BENEFICIO <= '"+criterea.getHasta()+"'";
//    }
    query += " GROUP BY sede.CODIGO, sede.NOMBRE, prog.CODIGO, prog.NOMBRE, subpro.CODIGO, "+
             "subpro.NOMBRE";
             
    query += " ORDER BY prog.NOMBRE,subpro.NOMBRE,sede.NOMBRE ";
    ResultSet rst = null;
    ArrayList lbeneotor = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
    RepBeneficioOtorgadoVO beneotorVO = null;
		while ( rst.next() ) 
		{
        beneotorVO = new RepBeneficioOtorgadoVO();
       
        beneotorVO.setCodeSede(new Long (rst.getLong("codsede")));
        beneotorVO.setNombreSede(rst.getString("nomsede"));
        beneotorVO.setCodePrograma(new Long(rst.getLong("codpro")));
        beneotorVO.setNombrePrograma(rst.getString("nompro"));
        beneotorVO.setCodeSubprograma(new Long (rst.getLong("codsubpro")));
        beneotorVO.setNombreSubprograma(rst.getString("nomsubpro"));
        beneotorVO.setDesde(criterea.getDesde());
        beneotorVO.setHasta(criterea.getHasta());
        beneotorVO.setCantidad(rst.getString("cantidad_otorgada"));
        lbeneotor.add(beneotorVO);
        
        beneotorVO=null;
		}
  	rst.close();
    return lbeneotor;
  }
  
    public Collection getBeneficioOtorgadoConGestor(RepBeneficioOtorgadoVO criterea) throws SQLException
    {
      String query = "SELECT COUNT(beneotor.codigo) cantidad_otorgada, sede.CODIGO codsede, "+
                     "sede.NOMBRE nomsede, prog.CODIGO codpro, prog.NOMBRE nompro, "+
                     "subpro.CODIGO codsubpro, subpro.NOMBRE nomsubpro "+
                     "FROM TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA subpro, "+
                     "TCS_BEN_BENEFICIO_OTORGADO beneotor, TCS_BEN_SEDE sede, TCS_BEN_SUBP_ATR_BENEFICIARIO sab "+
                     "WHERE beneotor.SBPR_CODIGO =  subpro.CODIGO "+
                     "AND beneotor.SEDE_CODIGO = sede.CODIGO AND subpro.PRG_CODIGO = prog.CODIGO "+
                     "AND beneotor.FECHA_BENEFICIO <= sysdate and prog.vigencia='A' and subpro.vigencia='A' " +
                     "AND sab.sbpr_codigo = subpro.codigo AND UPPER(TRIM(sab.NOMBRE)) = 'GESTOR' ";
      
      
      if((Object)criterea.getCodeSede() != null)
      {
        query += " and sede.CODIGO = "+criterea.getCodeSede();
      }
      if((Object)criterea.getCodeSubprograma() != null)
      {
        query += " and subpro.CODIGO = "+criterea.getCodeSubprograma();
      }
      if((Object)criterea.getCodePrograma() != null)
      {
        query += " and prog.CODIGO = "+criterea.getCodePrograma();
      }
     
      if((Object)criterea.getDesde() != null && (Object)criterea.getHasta() != null)
      {
        query += " and beneotor.FECHA_BENEFICIO between to_date('"+criterea.getDesde()+"','dd/mm/yyyy') and to_date('"+criterea.getHasta()+"','dd/mm/yyyy')";
      }
      
      if((Object)criterea.getGestor() != null && criterea.getCodigoAtrGestor() != null){
        query += " and Fcs_Ben_Valor_Atributo("+criterea.getCodigoAtrGestor()+", beneotor.CODIGO, beneotor.BEN_CODIGO, beneotor.FECHA_BENEFICIO) = '"+criterea.getGestor()+"' ";
      }
    
      query += " GROUP BY sede.CODIGO, sede.NOMBRE, prog.CODIGO, prog.NOMBRE, subpro.CODIGO, "+
               "subpro.NOMBRE";
               
      query += " ORDER BY prog.NOMBRE,subpro.NOMBRE,sede.NOMBRE ";
      ResultSet rst = null;
      ArrayList lbeneotor = new ArrayList();
      rst = cf.getRecordsRset(query,null,conn);
      RepBeneficioOtorgadoVO beneotorVO = null;
        while ( rst.next() ) {
            beneotorVO = new RepBeneficioOtorgadoVO();
            
            beneotorVO.setCodeSede(new Long (rst.getLong("codsede")));
            beneotorVO.setNombreSede(rst.getString("nomsede"));
            beneotorVO.setCodePrograma(new Long(rst.getLong("codpro")));
            beneotorVO.setNombrePrograma(rst.getString("nompro"));
            beneotorVO.setCodeSubprograma(new Long (rst.getLong("codsubpro")));
            beneotorVO.setNombreSubprograma(rst.getString("nomsubpro"));
            beneotorVO.setDesde(criterea.getDesde());
            beneotorVO.setHasta(criterea.getHasta());
            beneotorVO.setCantidad(rst.getString("cantidad_otorgada"));
            lbeneotor.add(beneotorVO);
            
            beneotorVO=null;
        }
          rst.close();
      return lbeneotor;
    }
  
  public Collection getListaAtri(String CodAtri) throws SQLException
  {
    int iCodAtri=Integer.parseInt(CodAtri.trim());
    String query = "SELECT vfl.DESCRIPCION descrip, vfl.CODIGO_VALOR codvalor "+
                   "FROM TCS_BEN_SUBP_ATR_BENEFICIARIO atri, "+
                   "paoyer.TCS_TIPO_VALOR_FLEX tvfl, paoyer.TCS_VALOR_FLEXIBLE vfl "+
                   "WHERE atri.CODIGO = "+iCodAtri+" "+
                   "AND atri.TTVF_CODIGO_DOMINIO=tvfl.CODIGO "+
                   "AND tvfl.CODIGO=vfl.TVF_CODIGO "+
                   "AND vfl.VIGENCIA='S'";
    
    
    ResultSet rst = null;
    ArrayList lista = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
    
		while ( rst.next() ) 
		{
      VflexVO vflVO = new VflexVO();
      vflVO.setDescVflex(rst.getString("descrip"));
      vflVO.setCodigoVflex(rst.getString("codvalor"));
      vflVO.setNombreVflex(rst.getString("codvalor")+"~"+rst.getString("descrip"));
    
      lista.add(vflVO);
		}
  	rst.close();
    return lista;
  }
  
  public List getAtributoEspecificos(String strSubprograma)throws SQLException
  {
    int sub=Integer.parseInt(strSubprograma.trim());
    String strSQL;
    List listaAtriEsp = new LinkedList();
    
    strSQL = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, nvl(REST_CODIGO,'0') REST_CODIGO, ORDEN, LONGITUD, "+
             "OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, VIGENCIA, "+
             "DESCRIPCION, TIPO_DATO, TTVF_CODIGO_DOMINIO "+
             "FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE SBPR_CODIGO="+sub+" "+
             "AND VIGENCIA = 'A' ORDER BY ORDEN";

    
   ResultSet rst = null;
   rst = cf.getRecordsRset(strSQL,null,conn);
    
   while(rst.next())
   {
      RepAtributoVO repatriVO = new RepAtributoVO();
      repatriVO.setCodigo(new Long(rst.getString("CODIGO")));
      repatriVO.setEtiqueta(rst.getString("ETIQUETA"));
      repatriVO.setOrigen("E");
      listaAtriEsp.add(repatriVO);
   }
    return listaAtriEsp;
  }
  
//  public Collection findProgramaByUser(Long codeUser, Long codeGus) throws SQLException 
//  {
//    String query = "SELECT pro.codigo codePrograma, UPPER(pro.nombre) nomPrograma "+
//                   "FROM TCS_BEN_PROGRAMA pro, paoyer.tcs_usuario usu, paoyer.tcs_grupo_usuario gus "+
//                   "WHERE pro.CODIGO IN "+
//                   "                     (SELECT DISTINCT subpro.PRG_CODIGO "+
//                   "                     FROM TCS_BEN_SUBPROGRAMA subpro, paoyer.tcs_usuario usu, paoyer.tcs_grupo_usuario gus, "+
//                   "                     TCS_BEN_PROGRAMA pro,TCS_BEN_SUBPROGRAMA_USUARIO subus  "+
//                   "                     WHERE subpro.USU_CODIGO = usu.CODIGO "+
//                   "                     AND pro.codigo = subpro.PRG_CODIGO AND gus.CODIGO = "+codeGus+" "+
//                   "                     AND (33 = "+codeGus+" OR 128 = "+codeGus+" OR subpro.usu_codigo = "+codeUser+" OR pro.usu_codigo = "+codeUser+") "+
//                   "                     OR subus.SBPR_CODIGO = subpro.CODIGO AND subus.USU_CODIGO = usu.CODIGO "+
//                   "                     AND subus.USU_CODIGO = "+codeUser+" ) "+
//                   "AND pro.USU_CODIGO = usu.CODIGO AND gus.CODIGO = "+codeGus+
//                   //" AND (33 = "+codeGus+" OR 128 = "+codeGus+" OR usu_codigo = "+codeUser+") "+
//                   " AND Fcs_Ben_Val_Vigencia(pro.VIGENCIA, pro.DESDE_VIGENCIA, pro.HASTA_VIGENCIA, SYSDATE) = 'A' "+
//                   "ORDER BY pro.nombre";
//    //System.out.println(query);
//    ResultSet rst = null;
//    ArrayList programas = new ArrayList();
//    rst = cf.getRecordsRset(query,null,conn);
//		ProgramaVO pro = null;
//		while ( rst.next() ) 
//		{
//				pro = new ProgramaVO();
//				pro.setCode(new Long(rst.getLong( "codePrograma"))); 
//        pro.setNombre(rst.getString( "nomPrograma"));
//				programas.add(pro);
//				pro=null;
//		}
//  	rst.close();
//    return programas;
//  }
  
  /**
   * M�todo que me lista los programas por usuario sin tener en cuenta la vigencia
   * @param codeUser
   * @param codeGus
   * @return 
   * @throws java.sql.SQLException
   */
  public Collection findProgramaByUserReport(Long codeUser, String userGroupName, Long codeArea) throws SQLException 
  {
//    ProgramaDAO  proDAO = new ProgramaDAO(cf); 
//    Collection programas = proDAO.findProgramaByCriterea(new ProgramaVO(),codeUser,userGroupName, codeArea);
//    cf.closeConnection(proDAO.getConn());
//    return programas;
    
    ProgramaVO criterea = new ProgramaVO();
    String query = "SELECT DISTINCT pro.CODIGO COD_PROGRAMA, pro.NOMBRE NOM_PROGRAMA, pro.DESCRIPCION DESC_PROGRAMA, "+
                   "pro.OBJETIVO, pro.POBLACION_OBJETIVO, area.CODIGO COD_AREA, area.NOMBRE NOM_AREA, "+
                   "usu.CODIGO COD_USUARIO, usu.NOMBRE NOM_USUARIO, a.admProg "+
                   "FROM VCS_BEN_SUBPROG_ALLOWED a, "+
                   "TCS_BEN_PROGRAMA pro, TCS_BEN_AREA area, paoyer.TCS_USUARIO usu, "+
                   "paoyer.tcs_grupo_usuario gus, TCS_BEN_SUBPROGRAMA_USUARIO subus "+
                   "WHERE  gus.CODIGO = usu.GUS_CODIGO "+
                   "AND a.COD_PROGRAMA = pro.CODIGO "+
                   "AND pro.AREA_CODIGO = area.CODIGO "+
                   "AND pro.USU_CODIGO = usu.CODIGO "+
                   "AND pro.VIGENCIA = 'A' ";
    
    if((Object)codeUser != null)
    {
      query +="AND ('ADMINISTRADOR GENERAL' = '"+userGroupName+"' OR 'SUPER USUARIO' = '"+userGroupName+"' or admSubpro = "+codeUser+
            "          OR pro.USU_CODIGO = "+codeUser+" OR a.permisos = "+codeUser+" ";
            if(userGroupName != null && userGroupName.equals("ADMINISTRADOR SECRETARIA"))
            {
              query += " or COD_AREA = "+codeArea;
            }
            query += " ) ";
    }else
    {
      return null;
    }
                         
    if(criterea.getCode() != null)
    {
      query += "AND COD_PROGRAMA = "+criterea.getCode()+" ";
    }
    if(!criterea.getNombre().equalsIgnoreCase(""))
    {
      query += "AND NOM_PROGRAMA LIKE '%"+criterea.getNombre().toUpperCase().trim()+"%' ";
    }
    if(criterea.getCodeArea() != null)
    {
      query += "AND COD_AREA = "+criterea.getCodeArea();
    }
    
    query += " ORDER BY NOM_PROGRAMA";
    //System.out.println(query);
    ResultSet rst = null;
    ArrayList programas = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
		ProgramaVO pro = null;
		while ( rst.next() ) 
		{
				pro = new ProgramaVO();
				pro.setCode(new Long(rst.getLong( "COD_PROGRAMA"))); 
        pro.setNombre(rst.getString( "NOM_PROGRAMA"));
        pro.setDescripcion(rst.getString("DESC_PROGRAMA"));
        pro.setObjetivo(rst.getString("OBJETIVO"));
        pro.setPoblacionObjetivo(rst.getString("POBLACION_OBJETIVO"));
        pro.setCodeArea(new Long(rst.getString("COD_AREA")));
        pro.setNombreArea(rst.getString("NOM_AREA"));
        pro.setCodeUsuario(new Long(rst.getString("COD_USUARIO")));
        pro.setNombreUsuario(rst.getString("NOM_USUARIO"));
				programas.add(pro);
				pro=null;
		}
  	rst.close();
    return programas;
  }
  
    public Collection findProgramaWithGestorByUserReport(Long codeUser, String userGroupName, Long codeArea) throws SQLException 
    {
      ProgramaVO criterea = new ProgramaVO();
      String query = "SELECT DISTINCT pro.CODIGO COD_PROGRAMA, pro.NOMBRE NOM_PROGRAMA, pro.DESCRIPCION DESC_PROGRAMA, "+
                     "pro.OBJETIVO, pro.POBLACION_OBJETIVO, area.CODIGO COD_AREA, area.NOMBRE NOM_AREA, "+
                     "usu.CODIGO COD_USUARIO, usu.NOMBRE NOM_USUARIO, a.admProg "+
                     "FROM VCS_BEN_SUBPROG_ALLOWED a, "+
                     "TCS_BEN_PROGRAMA pro, TCS_BEN_AREA area, paoyer.TCS_USUARIO usu, TCS_BEN_SUBPROGRAMA sub, "+
                     "TCS_BEN_SUBP_ATR_BENEFICIARIO sab, paoyer.tcs_grupo_usuario gus, TCS_BEN_SUBPROGRAMA_USUARIO subus "+
                     "WHERE  gus.CODIGO = usu.GUS_CODIGO "+
                     "AND a.COD_PROGRAMA = pro.CODIGO "+
                     "AND pro.AREA_CODIGO = area.CODIGO "+
                     "AND pro.USU_CODIGO = usu.CODIGO "+
                     "AND pro.VIGENCIA = 'A' " +
                     "AND sub.prg_codigo = pro.codigo " +
                     "AND sab.SBPR_CODIGO = sub.codigo " +
                     "AND UPPER(TRIM(sab.nombre)) = 'GESTOR' ";
      
      if((Object)codeUser != null)
      {
        query +="AND ('ADMINISTRADOR GENERAL' = '"+userGroupName+"' OR 'SUPER USUARIO' = '"+userGroupName+"' or admSubpro = "+codeUser+
              "          OR pro.USU_CODIGO = "+codeUser+" OR a.permisos = "+codeUser+" ";
              if(userGroupName != null && userGroupName.equals("ADMINISTRADOR SECRETARIA"))
              {
                query += " or COD_AREA = "+codeArea;
              }
              query += " ) ";
      }else
      {
        return null;
      }
                           
      if(criterea.getCode() != null)
      {
        query += "AND COD_PROGRAMA = "+criterea.getCode()+" ";
      }
      if(!criterea.getNombre().equalsIgnoreCase(""))
      {
        query += "AND NOM_PROGRAMA LIKE '%"+criterea.getNombre().toUpperCase().trim()+"%' ";
      }
      if(criterea.getCodeArea() != null)
      {
        query += "AND COD_AREA = "+criterea.getCodeArea();
      }
      
      query += " ORDER BY NOM_PROGRAMA";

      ResultSet rst = null;
      ArrayList programas = new ArrayList();
      rst = cf.getRecordsRset(query,null,conn);
        ProgramaVO pro = null;
        while ( rst.next() ){
            pro = new ProgramaVO();
            pro.setCode(new Long(rst.getLong( "COD_PROGRAMA"))); 
            pro.setNombre(rst.getString( "NOM_PROGRAMA"));
            pro.setDescripcion(rst.getString("DESC_PROGRAMA"));
            pro.setObjetivo(rst.getString("OBJETIVO"));
            pro.setPoblacionObjetivo(rst.getString("POBLACION_OBJETIVO"));
            pro.setCodeArea(new Long(rst.getString("COD_AREA")));
            pro.setNombreArea(rst.getString("NOM_AREA"));
            pro.setCodeUsuario(new Long(rst.getString("COD_USUARIO")));
            pro.setNombreUsuario(rst.getString("NOM_USUARIO"));
            programas.add(pro);
            pro=null;
        }
          rst.close();
      return programas;
    }
    
  public Collection findSubProgramaByUser(Long codeUser, String userGroupName, String codeprograma, Long codeArea) throws SQLException 
  {

    SubProgramaDAO subProgDAO = new SubProgramaDAO(cf);
    SubProgramaVO subProgVO = new SubProgramaVO();
    subProgVO.setCodePrograma(new Long(codeprograma));
    Collection subprogramas=subProgDAO.findSubPrograma(subProgVO,codeUser,userGroupName,codeArea);
    cf.closeConnection(subProgDAO.getConn());
    return subprogramas;
//          int iCodePrograma = Integer.parseInt(codeprograma.trim());
//     String query =  " SELECT DISTINCT pro.CODIGO codprog,pro.NOMBRE nompro,subpro.codigo codeSubprograma, "+
//                     " UPPER(subpro.nombre) nomSubprograma, usu.codigo,subpro.usu_codigo,pro.usu_codigo "+
//                     " FROM TCS_BEN_SUBPROGRAMA subpro, TCS_BEN_PROGRAMA pro, TCS_BEN_SUBPROGRAMA_USUARIO subus, paoyer.tcs_usuario usu "+
//                     " WHERE pro.codigo = subpro.PRG_CODIGO "+
//                     " AND ( subpro.CODIGO = subus.SBPR_CODIGO OR 33 = "+codeGus+" OR 128 = "+codeGus+"  OR subpro.usu_codigo = "+codeUser+" OR pro.usu_codigo = "+codeUser+") "+
//                     " AND  (subus.USU_CODIGO = usu.CODIGO OR 33 = "+codeGus+"  OR 128 = "+codeGus+"  OR subpro.usu_codigo = "+codeUser+" OR pro.usu_codigo = "+codeUser+") "+
//                     //" AND Fcs_Ben_Val_Vigencia(pro.VIGENCIA, pro.DESDE_VIGENCIA, pro.HASTA_VIGENCIA, SYSDATE) = 'A' "+
//                     //" AND Fcs_Ben_Val_Vigencia(subpro.VIGENCIA, subpro.DESDE_VIGENCIA, subpro.HASTA_VIGENCIA, SYSDATE) = 'A' "+
//                     " AND usu.CODIGO = "+codeUser+" "+
//                     " AND pro.CODIGO = "+iCodePrograma+" ORDER BY nompro";
//                          
//    //System.out.println(query);
//    ResultSet rst = null;
//    ArrayList subprogramas = new ArrayList();
//    rst = cf.getRecordsRset(query,null,conn);
//		SubProgramaVO subpro = null;
//    while ( rst.next() ) 
//    {
//        subpro = new SubProgramaVO();
//        subpro.setCode(new Long(rst.getLong( "codeSubprograma"))); 
//        subpro.setNombre(rst.getString( "nomSubprograma"));
//        subpro.setNombrePrograma(rst.getString("nompro"));
//        subprogramas.add(subpro);
//        subpro=null;
//        
//    }
//        rst.close();
//    return subprogramas;
  }
  
  public Collection findPermissionsReports (Long codeUser, String userGroupName, String codeprograma, Long codeArea) throws SQLException 
  {
      String query =  "SELECT DISTINCT pro.CODIGO codprog,pro.NOMBRE nompro,subpro.codigo codeSubprograma, "+
                      "UPPER(subpro.nombre) nomSubprograma, usu.codigo,subpro.usu_codigo,pro.usu_codigo "+
                      "FROM TCS_BEN_SUBPROGRAMA subpro, "+
                      "TCS_BEN_PROGRAMA pro, "+
                      "TCS_BEN_SUBPROGRAMA_USUARIO subus, "+
                      "paoyer.tcs_usuario usu "+
                      "WHERE pro.codigo = subpro.PRG_CODIGO "+
                      "AND (subpro.CODIGO = subus.SBPR_CODIGO OR 'ADMINISTRADOR GENERAL' = '"+userGroupName+"' "+
                      "     OR 'SUPER USUARIO' = '"+userGroupName+"' OR subpro.usu_codigo = "+codeUser+" OR pro.usu_codigo = "+codeUser+") "+
                      "AND subus.USU_CODIGO = usu.CODIGO "+
                      "AND usu.CODIGO = "+codeUser+" "+
                      "ORDER BY nompro";
                  
    //System.out.println(query);
    ResultSet rst = null;
    ArrayList subprogramas = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
		SubProgramaVO subpro = null;
    while ( rst.next() ) 
    {
        subpro = new SubProgramaVO();
        subpro.setCode(new Long(rst.getLong( "codeSubprograma"))); 
        subpro.setNombre(rst.getString( "nomSubprograma"));
        subpro.setNombrePrograma(rst.getString("nompro"));
        subprogramas.add(subpro);
        subpro=null;
        
    }
        rst.close();
    return subprogramas;
  }
  
  /**
   * M�todo para calcular los beneficios de un programa sin tener en cuenta la vigencia
   * @param codeUser
   * @param codeGus
   * @param codeprograma
   * @return 
   * @throws java.sql.SQLException
   */
  public Collection findSubProgramaByUserReport(Long codeUser, String userGroupName, String codeprograma,Long codeArea) throws SQLException 
  {
    SubProgramaDAO subProgDAO = new SubProgramaDAO(cf);
    SubProgramaVO subProgVO = new SubProgramaVO();
    subProgVO.setCodePrograma(new Long(codeprograma));
    Collection subprogramas=subProgDAO.findAllowedSubPrograma(subProgVO,codeUser,userGroupName,codeArea);
    cf.closeConnection(subProgDAO.getConn());
    return subprogramas;
  }
  
    public Collection findSubProgramaWithGestorByUserReport(Long codeUser, String userGroupName, String codeprograma,Long codeArea) throws SQLException 
    {
      SubProgramaDAO subProgDAO = new SubProgramaDAO(cf);
      SubProgramaVO subProgVO = new SubProgramaVO();
      subProgVO.setCodePrograma(new Long(codeprograma));
      Collection subprogramas=subProgDAO.findAllowedSubProgramaWithGestor(subProgVO,codeUser,userGroupName,codeArea);
      cf.closeConnection(subProgDAO.getConn());
      return subprogramas;
    }

  

  public Connection getConn()
 {
    return conn;
 }
}